Verilog-A 语法基础

语法简单而严格。熟悉 C/C++/Perl 者上手快;函数使用受多种限制,代码行为更依赖仿真器而非解释器。

注释

// 单行注释
/* 多行
   注释 */

多行注释在特殊字符上可能引起问题,优先用 //。

命名规则

数字常量

整数(十进制):100、9;二进制 'b011x11、'b0010100010

浮点:1e6(科学计数法)、1.34e2

工程单位字符(数量级):

字符 倍数 字符 倍数
T 10¹² m 10⁻³
G 10⁹ u 10⁻⁶
M 10⁶ n 10⁻⁹
K / k 10³ p 10⁻¹²
f 10⁻¹⁵
a 10⁻¹⁸

用法:1K、10M、1p、1n

字符串

换行与分号

if(V(out, gnd)>vth) begin
  xout=1;
  yout=V(out, gnd);
end

空白

运算符优先级

优先级 运算符 说明
1(最高) + - ! ~ & ~& | ~| ^ ^~ 一元运算符
2 * / % 乘除取余
3 + - 加减
5 < > <= >= 关系
6 == != === !== 相等(含 X/Z 判断用 =/!)
7 & 按位与
8 ^ ^~ 按位异或/同或
9 | 按位或
10 && 逻辑与
11(最低) || 逻辑或

完整运算符细节见 04 - VerilogA 运算符。

包含外部文件(编译器指令)

`include "constants.vams"
`include "disciplines.vams"
discipline electrical
potential Voltage ;
flow Current ;
enddiscipline

模拟过程(analog 块)

所有模拟行为代码放在 analog begin ... end 之间:

analog begin
    V(P ,N) <+ I(P, N)*R;   // 电阻描述
end

赋值:= 与 <+ 的本质区别

运算符 用途 计算方式 叠加性
= integer/real 变量赋值 直接计算,无需迭代 覆盖:R=R1; R=R2; → R=R2
<+ 模拟量(V/I)贡献 仿真器迭代求解的方程 叠加:多个 <+ 对同一量求和
V(P,N) <+ V1;
V(P,N) <+ V2;   // 结果 V(P,N) = V1 + V2

<+ 只能出现在 analog 块内;= 几乎可用在任何位置。

条件与循环语句

if 语句

if (X)
    A;
else if (Y)
    B;
else
    C;
if (X) begin
    A; B;
end else begin
    C;
end

case 语句

case(value)
(1)      : A;
(2)      : B;
default  : D;
endcase

循环语句

// for(不支持 i++,必须 i = i + 1)
for (i = 1; i < 10; i = i + 1) total = total + i;

// while
i = 1;
while (i < 10) begin
    i = i + 1;
    total = total + i;
end

// repeat(次数必须为常数,不适用模拟变量)
repeat (9) begin
    i = i + 1;
    total = total + i;
end

genvar 与总线循环

普通 integer 循环不能访问总线端口(仿真器无法在编译期展开):

genvar i;                        // ✅ 用 genvar
for (i = 1; i < 10; i = i + 1)
    V(out[i]) <+ V(in[i]);

实战提示

  1. 多用乘法少用除法:V(P,N) <+ I(P,N)*R; 优于 I(P,N) <+ V(P,N)/R;——R=0 时除法易出问题。
  2. 端口按信号流定义 input/output/inout,模拟端口声明 electrical。
  3. 总线端口:input [1:12] bus; electrical [1:12] bus;,访问 bus[1]。

相关笔记